package znyl.nursing.util;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;

/**
 * 身份证工具类
 */
public class IDCardUtils {

    /**
     * 通过身份证号获取精准年龄（考虑是否已过当年生日）
     * @param idCard 身份证号（支持15位/18位）
     * @return 年龄（null表示身份证号无效或格式错误）
     */
    public static Integer getAgeByIdCard(String idCard) {
        // 1. 校验身份证号合法性（基础长度校验）
        if (idCard == null || (idCard.length() != 15 && idCard.length() != 18)) {
            return null; // 非15/18位身份证号，返回null
        }

        // 2. 提取出生日期字符串（15位补"19"，统一转为"yyyyMMdd"格式）
        String birthDateStr;
        if (idCard.length() == 18) {
            birthDateStr = idCard.substring(6, 14); // 18位：第7-14位是出生日期（yyyyMMdd）
        } else { // 15位
            birthDateStr = "19" + idCard.substring(6, 12); // 15位：第7-12位是出生日期（MMddyy），补"19"转为yyyyMMdd
        }

        try {
            // 3. 解析出生日期为LocalDate对象
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
            LocalDate birthDate = LocalDate.parse(birthDateStr, formatter);
            LocalDate currentDate = LocalDate.now(); // 当前日期

            // 4. 计算精准年龄（通过ChronoUnit.YEARS.between自动处理“未过生日”场景）
            long age = ChronoUnit.YEARS.between(birthDate, currentDate);
            return age < 0 ? null : (int) age; // 避免出生日期大于当前日期的异常情况
        } catch (Exception e) {
            // 解析失败（如出生日期不合法，如20240230），返回null
            return null;
        }
    }
    // 获取性别（0-女，1-男）
    public static int getGenderFromIdCard(String idCard) {
        if (idCard == null || idCard.length() != 18) {
            throw new IllegalArgumentException("身份证号有误，请重新输入");
        }
        String genderCode = idCard.substring(16, 17); // 第17位，截取16-17位
        int gender = Integer.parseInt(genderCode);// 将截取的性别码转为整型
        return gender % 2 == 0 ? 0 : 1;
    }

    /**
     * 内部辅助方法，从身份证号中提取出生日期的LocalDate对象。
     *
     * @param idCard 身份证号码
     * @return 出生日期的LocalDate对象，或null（如果身份证号码无效）
     */
    private static LocalDate extractBirthDate(String idCard) {
        if (idCard == null || idCard.length() != 18) {
            return null;
        }
        try {
            String birthStr = idCard.substring(6, 14);
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
            return LocalDate.parse(birthStr, formatter);
        } catch (Exception e) {
            return null;
        }
    }
    /**
     * 根据身份证号提取出生日期。
     *
     * @param idCard 身份证号码
     * @return 出生日期，LocalDateTime类型
     */
    public static LocalDateTime getBirthDateByIdCard(String idCard) {
        String birthDateString = idCard.substring(6, 14); // 身份证号码中的出生日期部分
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
        LocalDate birthDate = LocalDate.parse(birthDateString, formatter);
        return LocalDateTime.of(birthDate, LocalTime.MIDNIGHT);
    }

}